今天就tp中(含表情)无限级评论回复做一个个人总结。
1.准备TP基本框架
2.数据库,数据表的建立
A.先说说数据库(表)的建立。
a-1,数据库:blog
a-2,数据表:bolg_comment. 建立如下:
CREATE TABLE IF NOT EXISTS `blog_comment` ( `id` int(10) NOT NULL AUTO_INCREMENT, `content` varchar(500) NOT NULL, `pid` int(10) NOT NULL, `email` varchar(50) DEFAULT NULL, `add_time` int(30) NOT NULL, `author` varchar(30) NOT NULL, `isShow` int(1) NOT NULL DEFAULT '0', `ip` varchar(50) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;
NSERT INTO `blog_comment` (`id`, `content`, `pid`, `email`, `add_time`, `author`, `isShow`, `ip`) VALUES(1, '路过,路过', 0, '', 0, '隔壁老王', 0, ''),(2, '暂停一下', 0, '', 0, '兔斯基', 0, ''),(3, '你好', 1, '', 0, '会飞的鱼', 0, ''),(4, 'helloword', 2, '', 0, '丘比龙', 0, ''),(5, 'hello', 3, '', 0, '蜡笔小新', 0, ''),(6, 'hellorword', 3, '', 1450247783, '漫步语林', 0, '0.0.0.0'),(7, '围观,你们继续', 2, '', 1450248001, '维尼熊', 0, '0.0.0.0'),(8, '[em_1]', 1, '', 1450248492, '小飞象', 0, '0.0.0.0'),(11, 'qqqq22222', 0, NULL, 1450772015, 'qq222222', 0, '127.0.0.1');
其中,content表:评论内容;pid表关联的父id;add_time表评论时间;author表评论作者;ip表发评论者的ip。
==================================================================================
B.接着就是TP框架,我选用的是:thinkphp_3.2.3_full版本,服务器Nginx,数据库MariaDB
b-1,我的应用名称:tper
b-1,数据库信息配置:tper/Application/Common/conf/config.php
'配置值' /* 大小写URL */ 'URL_CASE_INSENSITIVE' => false, /* 数据库设置 */ 'DB_TYPE' => 'mysql', 'DB_HOST' => 'localhost', 'DB_NAME' => 'blog', 'DB_USER' => 'root', 'DB_PWD' => 'root', 'DB_PORT' => '3306', 'DB_PREFIX' => 'blog_', /* 模块列表 */ 'MODULE_ALLOW_LIST' => array ('Home','Admin'), /* 默认模块 */ 'DEFAULT_MODULE' => 'Home', 'SHOW_PAGE_TRACE'=>true, // 'URL_MODEL' => 2,);
b-2,控制器:CommonController.class.php 和 IndexController.class.php
CommentList($pid = 0, $commentList = array(), $spac = 0); // var_dump($comment); $this->assign('commentList', $comment); $this->display(); // $this->display(); } //评论 public function addComment() { // var_dump(I('post.')); // $ip = get_client_ip(); // echo $ip; // $iplong = ip2long($ip); // echo ''; // echo $iplong; $rules = array(//定义动态验证规则 array('comment', 'require', '评论不能为空'), array('username', 'require', '昵称不能为空'),// array('username', '3,15', '用户名长度必须在3-15位之间!', 0, 'length', 3), ); $data = array( 'content' => I("post.comment"), 'ip' => get_client_ip(), 'add_time' => time(), 'pid' => I('post.pid'), 'author' => I('post.username'), ); $comment = M("comment"); // 实例化User对象 if (!$comment->validate($rules)->create()){ //验证昵称和评论 exit($comment->getError()); }else{ $add = $comment->add($data); if($add){ $this->success('评论成功'); }else{ $this->error('评论失败'); } } } //评论列表 function CommentList($pid = 0, &$commentList = array(), $spac = 0) { static $i = 0; $spac = $spac + 1; //初始为1级评论 $List = M('comment')-> field('id,add_time,author,content,pid')-> where(array('pid' => $pid))->order("id DESC")->select(); // echo ''; // var_dump($List); foreach ($List as $k => $v) { $commentList[$i]['level'] = $spac; //评论层级 $commentList[$i]['author'] = $v['author']; $commentList[$i]['id'] = $v['id']; $commentList[$i]['pid'] = $v['pid']; //此条评论的父id $commentList[$i]['content'] = $v['content']; $commentList[$i]['time'] = $v['add_time']; // $commentList[$i]['pauthor']=$pautor; $i++; $this->CommentList($v['id'], $commentList, $spac); } return $commentList; }}
其中评论列表的方法:“CommentList”,值得学习。
b-3.模板:View/Index/index.html
Thinkphp带表情的无限评论回复 评论
{$vo.author} 回复 {$vo.time|date="Y-m-d",###}{$vo.author} 回复{$vo.pauthor} {$vo.content|reFace}
其中:
{$vo.content|reFace}中的reFace方法如下:(tper/Application/Common/Common/function.php)
",$str); } return $str;}
还有一点注意:
"" 这里是使用__ROOT__,而不是__APP__.不然表情图片会调用不成功。
当然还有其他文件,如js,css,images等。这里就不做细讲。
来源:
示例:
注意:下载后,不一定会执行成功,里面有些调用不一定正确。如:上面提到的__ROOT__的使用,而不是__APP__的使用。
如果优化代码,增加客户体验,可以做如下的代码处理。
思路:当客户选择“表情”图片后,<textarea>域里面展示的是代替字符,并不是当前的表情图片,只有当提交信息后才会显示。
处理:当鼠标离开<testarea>后,通过事件的到域中内容,然后通过Ajax处理,得到当前的"表情"图片。方法已有,如:
function reFace($str){ for($i=1;$i<76;$i++){ // $path = __URL__; // echo $path; $str = str_replace("[em_$i]","",$str); } return $str;}
适当处理即可。